<?php
/**
 * > モンスターモデルマッパー
 *
 * モンスターモデルに対し、
 * データの格納や更新を行うクラス。
 *
 * LICENSE: Miracle Maple by Mirage is licensed
 * under a Creative Commons 表示-非営利-継承 2.1 日本 License.
 *
 * @category   monster
 * @package    maple-story.jp
 * @version    8.0.0
 * @link       http://maple-story.jp/
 * @since      File available since Release 8.0.0
 * @copyright  Copyright 2011 Miracle Maple
 * @license    http://creativecommons.org/licenses/by-nc-sa/2.1/jp/     Creative Commons BY-NC-SA
 */
class Model_Mapper_TrnMonster extends Model_Mapper_MapperAbstract
{
	public function search($options)
	{
		if (!is_array($options)) {
			throw new Exception('Invalid parameter has provided.');
		}
		
		$select = $this->getDbTable()->select();
		$select->where("delete_flg = 0")
			   ->where("link IS NULL")
			   ->where("invincible_flg = 0")
			   ->where("only_normal_attack_flg = 0");
		
		// 名前
		if (isset($options['name'])) {
			$select->where("name LIKE ? COLLATE utf8_unicode_ci", "%" . $options['name'] . "%");
		}
		
		// レベル
		if (isset($options['lv'])) {
			if (strpos($options['lv'], '-') === false) {
				$select->where("level = ?", $options['lv']);
			} else {
				$level = explode('-', $options['lv']);
				if ($level[0] == '') {
					$level[0] = 0;
				}
				if ($level[1] == '') {
					$level[1] = 999;
				}
				$select->where("level >= ?", trim($level[0]))
				       ->where("level <= ?", trim($level[1]));
			}
		}
		
		// エリア
		if (isset($options['area'])) {
			// エリア名からエリアコード取得
			// エリアコードからマップ ID 取得
			// trn_monster_map をマップ ID から検索 
		}
		
		// オプション
		if (isset($options['option'])) {
			foreach (explode('-', $options['option']) as $option) {
				switch ($option) {
					case 'first':
						$select->where("first_attack_flg = 1");
						break;
					case 'boss':
						$select->where("boss_flg = 1");
						break;
					case 'deadly':
						$select->where("deadly_attack_flg = 1");
						break;
					case 'undead':
						$select->where("undead_flg = 1");
						break;
					default:
						break;
				}
			}
		}
		
		// レアドロップレベル
		if (isset($options['rare']) && is_numeric($options['rare'])) {
			$select->where("rare_item_drop_level = ?", $options['rare']);
		}
	
		// 表示順序
		if (isset($options['order'])) {
			switch ($options['order']) {
				default:
				case 'level asc':
					$select->order(array("level ASC", "wid ASC"));
					break;
				case 'name asc':
					$select->order(array("name ASC", "level ASC", "wid ASC"));
					break;
				case 'exp desc':
					$select->order(array("exp DESC", "level ASC", "wid ASC"));
					break;
			}
		}
		   
		return $this->fetchAll($select);
	}
}
